<?php
/**
 * Page d'index de l'administration
 * Donne accès à chaque pages liées à l'administration
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class joursdesactivespromotionAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des jours désactivés');
	$this->addAriane(shRequest::link('administration'), 'Administration');
    }


    /**
     * Execute la méthode par défaut pour l'action index
     */
    public function execute($_id_promotion = null) {

	if($_id_promotion != null) {
	    $promotion = shSGBD::selectOne(
		    'SELECT promotion.id AS id_promotion, promotion.date_debut, promotion.date_fin, '.
		    'filiere.intitule AS intitule_filiere, specialite.intitule AS intitule_specialite '.
		    'FROM promotion '.
		    'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
		    'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
		    'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
		    'WHERE promotion.id=:id_promotion '.
		    'AND responsable.id_user=:id_user',
		    array(':id_promotion'=>$_id_promotion, ':id_user'=>shSession::__instance()->getId())
	    );

	    if(!$promotion)
		throw new Exception('Paramètre numéro de promotion non correct ou vous n\'avez pas les droits sur cette promotion', 404);

	    $jours_desactives = shSGBD::select(
				     'SELECT jours_desactives.id, jours_desactives.date_debut, '.
				     'jours_desactives.date_fin '.
				     'FROM jours_desactives '.
				     'INNER JOIN jours_desactives_promotion ON jours_desactives_promotion.id_jours_desactives=jours_desactives.id '.
				     'WHERE jours_desactives_promotion.id_promotion=:id_promotion ',
				     array(':id_promotion'=>$_id_promotion)
	    );

	    $this->assign('promotion', $promotion);
	    $this->assign('jours_desactives', $jours_desactives);
	}
	else {
	    throw new Exception('Paramètre numéro de promotion non trouvé', 404);
	}
    }

    /**
     * Execute la méthode par défaut pour l'action index
     */
    public function executeCreate($_id_promotion = null) {
	// Création du formulaire
	$formulaire = new shFormulaire();
	$formulaire->setSubmitText('Ajouter la période désactivée');

	if($_id_promotion == null)
	    throw new Exception('paramètre numéro identifiant de promotion non trouvée');

	$promotion = shSGBD::selectOne(
	    'SELECT promotion.id '.
	    'FROM promotion '.
	    'WHERE promotion.id=:id_promotion ',
	    array(':id_promotion'=>$_id_promotion)
	);

	if(!$promotion)
	    throw new Exception('Promotion non trouvée');

	// Ajout d'un champ date pour la date de début
	shField::date('Date de début')
	    ->appendTo($formulaire);

	// Ajout d'un champ date pour la date de fin
	shField::date('Date de fin')
	    ->appendTo($formulaire);


	// Submit du formulaire
	$formulaire->setCheck(function($formulaire) {
	    // Vérification des dates
	    if(Date::fromFormulaire($formulaire->getField('Date de début')->getValue()) >
		    Date::fromFormulaire($formulaire->getField('Date de fin')->getValue()) ) {
		$formulaire->getField('Date de début')->setError('La date de début doit être inférieure à la date de fin');
	    }

	});

	// Submit du formulaire
	$formulaire->setSubmit(function($formulaire) use($_id_promotion) {
	    // Enregistrement de la période : Table jours_desactives
	    $id_jours_desactives = shSGBD::insert(
		    'INSERT INTO jours_desactives '.
		    '(date_debut, date_fin) '.
		    'VALUES (:date_debut, :date_fin) ',
		    array(':date_debut'=>Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
			':date_fin'=>Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD()
	    ));

	    shSGBD::insert(
		    'INSERT INTO jours_desactives_promotion '.
		    '(id_promotion, id_jours_desactives) '.
		    'VALUES (:id_promotion, :id_jours_desactives) ',
		    array(':id_promotion'=>$_id_promotion,
			':id_jours_desactives'=>$id_jours_desactives)
	    );


	    // Redirection
	    shAction::redirect(shRequest::__instance()->getModule(),
		    shRequest::__instance()->getAction(),
		    null, $_id_promotion);
	});

	// Assignement du formulaire
	$this->assign('formulaire', $formulaire);

    }


   /**
     * Execute la méthode par défaut pour l'action index
     * @param <integer> id jours desactives à modifier
     */
    public function executeEdit($_id_promotion = null, $_id_jours_desactives = null) {
	// Création du formulaire
	$formulaire = new shFormulaire();
	$formulaire->setSubmitText('Modifier la période désactivée');

	if($_id_promotion == null)
	    throw new Exception('Numéro d\'identifiant de promotion non trouvé ', 404);

	if($_id_jours_desactives == null)
	    throw new Exception('Numéro d\'identifiant de période non trouvé ', 404);


	// Sélection de la période
	$jours_desactives = shSGBD::selectOne(
		'SELECT jours_desactives.id, jours_desactives.date_debut, jours_desactives.date_fin '.
		'FROM jours_desactives '.
		'WHERE jours_desactives.id=:id_jours_desactives ',
		array(':id_jours_desactives'=>$_id_jours_desactives)
	);

	if(!$jours_desactives)
	    throw new Exception('Numéro d\'identifiant de période non trouvée ', 404);

	// Ajout d'un champ date pour la date de début
	shField::date('Date de début')
	    ->setValue(Date::fromSGBD($jours_desactives->date_debut)->toFormulaire())
	    ->appendTo($formulaire);

	// Ajout d'un champ date pour la date de fin
	shField::date('Date de fin')
	    ->setValue(Date::fromSGBD($jours_desactives->date_fin)->toFormulaire())
	    ->appendTo($formulaire);


	// Submit du formulaire
	$formulaire->setCheck(function($formulaire) {
	    // Vérification des dates
	    if(Date::fromFormulaire($formulaire->getField('Date de début')->getValue()) >
		    Date::fromFormulaire($formulaire->getField('Date de fin')->getValue()) ) {
		$formulaire->getField('Date de début')->setError('La date de début doit être inférieure à la date de fin');
	    }

	});

	// Submit du formulaire
	$formulaire->setSubmit(function($formulaire) use($_id_promotion, $_id_jours_desactives) {

	    $count = shSGBD::count(
		    'SELECT count(jours_desactives_promotion.id_promotion) '.
		    'FROM jours_desactives_promotion '.
		    'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives '.
		    'AND jours_desactives_promotion.id_promotion!=:id_promotion',
		    array(':id_jours_desactives'=>$_id_jours_desactives, ':id_promotion'=>$_id_promotion)
	    );


	    // Si aucune autre promotion n'est enregistrée pour la période,on update la période
	    if($count == 0) {
		// MAJ de la période : Table jours_desactives
		shSGBD::update(
			'UPDATE jours_desactives '.
			'SET date_debut=:date_debut, '.
			'date_fin=:date_fin '.
			'WHERE jours_desactives.id=:id_jours_desactives ',
			array(':id_jours_desactives'=>$_id_jours_desactives,
			    ':date_debut'=>Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
			    ':date_fin'=>Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD())
		);
	    }
	    else {
		// Suppression du lien entre la promotion et la période
		shSGBD::delete(
			'DELETE FROM jours_desactives_promotion '.
			'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives '.
			'AND jours_desactives_promotion.id_promotion=:id_promotion',
			array(':id_jours_desactives'=>$_id_jours_desactives, ':id_promotion'=>$_id_promotion)
		);

		// Création d'une nouvelle période
		$id_jours_desactives = shSGBD::insert(
			'INSERT INTO jours_desactives '.
			'(date_debut, date_fin) '.
			'VALUES (:date_debut, :date_fin) ',
			array(':date_debut'=>Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
			    ':date_fin'=>Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD()
		));

		// Lien entre la promotion et la période
		shSGBD::insert(
			'INSERT INTO jours_desactives_promotion '.
			'(id_promotion, id_jours_desactives) '.
			'VALUES (:id_promotion, :id_jours_desactives) ',
			array(':id_promotion'=>$_id_promotion,
			    ':id_jours_desactives'=>$id_jours_desactives)
		);

	    }
	
	    // Redirection
	    shAction::redirect(shRequest::__instance()->getModule(),
		    shRequest::__instance()->getAction(),
		    null, $_id_promotion);
	});

	// Assignement du formulaire
	$this->assign('formulaire', $formulaire);

    }


    /**
     * Execute la méthode par défaut pour l'action index
     */
    public function executeDelete($_id_promotion = null, $_id_jours_desactives = null) {

	if($_id_promotion == null)
	    throw new Exception('Paramètre numéro de période de jours désactivés non trouvé', 404);

	if($_id_jours_desactives == null)
	    throw new Exception('Paramètre numéro de période de jours désactivés non trouvé', 404);


	// Suppression de tous les enregistrements des promotions
	shSGBD::delete(
		'DELETE FROM jours_desactives_promotion '.
		'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives '.
		'AND jours_desactives_promotion.id_promotion=:id_promotion',
		array(':id_jours_desactives'=>$_id_jours_desactives, ':id_promotion'=>$_id_promotion)
	);

	$count = shSGBD::count(
		'SELECT count(jours_desactives_promotion.id_promotion) '.
		'FROM jours_desactives_promotion '.
		'WHERE jours_desactives_promotion.id_jours_desactives=:id_jours_desactives ',
		array(':id_jours_desactives'=>$_id_jours_desactives));

	if($count == 0) {
	    // MAJ de la période : Table jours_desactives
	    shSGBD::delete(
		    'DELETE FROM jours_desactives '.
		    'WHERE jours_desactives.id=:id_jours_desactives ',
		    array(':id_jours_desactives'=>$_id_jours_desactives)
	    );
	}

	// Redirection
	shAction::redirect(shRequest::__instance()->getModule(),
		shRequest::__instance()->getAction(),
		null, $_id_promotion);
    }

}
?>
